无名名字空间

  有时,将一组声明包裹在一个名字空间里就是为了避免可能的名字冲突,这一做法经常也是很有价值的。这样做的目的只是保持代码的局部性,而不是为用户提供界面。例如,

    #include "header.h"
    namespace Mine {
        int a;
        void f() { /* ... */ }
        int g() { /* ... */ }
    }

因为我们并不希望名字Mine被局部的环境之外知道,去发明这个多余的名字也就成了一种烦恼,还可能偶然地与其他什么名字相冲突。在这种情况下,我们可以简单地让这个名字空间没有名字:

    #include "header.h"
    namespace {
        int a;
        void f() { /* ... */ }
        int g() { /* ... */ }
    }

很显然,必须存在某种方式,使我们可以从一个无名的名字空间之外访问其中的成员。因此,无名名字空间有一个隐含的使用指令。上面声明等价于

    namespace $$$ {
        int a;
        void f() { /* ... */ }
        int g() { /* ... */ }
    }
    using namespace $$$;

其中$$$是在这个名字空间定义所在的作用域里具有惟一性的名字。特别地,在不同编译单位里的无名名字空间也互不相同。正如我们所希望的,在其他编译单位里将无法说出这个无名名字空间中的成员名字。

🔚